package poo.banca;

import java.io.Serializable;

public class ContoConFido extends ContoBancario implements Serializable{

	/**
	 * 
	 */
	private static final long serialVersionUID = -5886485476671424818L;
	private double fido = 1000;
	private double scoperto;

	static int size = 0;
	static ContoBancario clientela[] = new ContoBancario[100];

	public ContoConFido(String numero) {

		super(numero);

	}

	public ContoConFido(String numero, double bilancio) {
		super(numero, bilancio);

	}

	public ContoConFido(String numero, double bilancio, double fido) {
		super(numero, bilancio);
		if (fido < 0)
			throw new IllegalArgumentException();

		this.fido = fido;
	}

	public double getFido() {
		return fido;
	}

	public void setFido(double fido) {
		if (fido < 0 || fido < scoperto)
			throw new IllegalArgumentException();

		this.fido = fido;
	}// set fido

	public double getScoperto() {
		return scoperto;
	}

	@Override
	public void deposita(double quanto) {
		if (quanto <= 0)
			throw new IllegalArgumentException();

		if (quanto <= scoperto) {

			scoperto -= quanto;

		} else {
			double residuo = quanto - scoperto;
			scoperto = 0;
			super.deposita(residuo);

		}

	}

	
	public boolean preleva(double quanto) {
		if (quanto <= 0)
			throw new IllegalArgumentException();

		if (quanto < saldo()) {
			return super.preleva(quanto);
		}
		if (quanto <= saldo() + fido - scoperto) {
			double residuo = saldo();
			super.preleva(residuo);
			scoperto += quanto - residuo;
			return true;

		}
		return false;

	}// preleva

	public String toString() {
		return super.toString()
				+ String.format(" fido =%1.2f scoperto =%1.2f ", fido, scoperto);

	}// toString

	public static void report() {
		for (int i = 0; i < size; i++) {

			System.out.println(clientela[i]);
		}

	}

	public static void premi() {
		for (int i = 0; i < size; i++) {

			if (clientela[i] instanceof ContoConFido) {

				ContoConFido cf = (ContoConFido) clientela[i];
				cf.setFido(cf.getFido() + 200);
			}else{
				ContoBancario cb = (ContoBancario)clientela[i];
				cb.deposita(50);
			}

		}
	}

	public static void main(String[] args) {

		ContoBancario cb = new ContoBancario("51/3742/53", 100);

		ContoConFido cf = new ContoConFido("52/2233/44", 10000, 5000);
		cb.deposita(50);
		cf.preleva(11000);

		System.out.println(cb);
		System.out.println(cf);

		if (cb instanceof ContoConFido) {
			System.out.println("yes!!");
		}

		clientela[0] = cb;
		size++;
		clientela[1] = cf;
		size++;
		premi();
		report();

	}

}// ContoConFido
